/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.gebze;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import org.gebze.param.Parametre;
import org.gebze.Util.GbzScannerClientHandler;
import org.gebze.Util.GbzTerminal;

/**
 * Programın Server Tarafı
 *
 * @author Özcan ÇAĞIRICI <ozcan.cagirici@gmail.com>
 * @author Hatice Şahin <haticesahin.09@gmail.com>
 */
public class GbzServer
        extends GbzBase {

    private ServerSocket socket;
    private Map<String, GbzScannerClientHandler> sockets;
    private transient boolean isServerStart;

    /**
     * Default Constructor. Constructor çağrıldığında server ayarlarını yapar.
     * Dışarıdan tarama emri geldiğinde ilgili clienttan verileri alır.
     */
    public GbzServer()
            throws IOException {
        serverAyarlariniYap();
        socket = new ServerSocket(getPortNumber());
        sockets = new HashMap<String, GbzScannerClientHandler>();
        isServerStart = true;
    }

    @Override
    public boolean start() throws IOException {
        if (socket != null) {
            while (isServerStart) {
                Thread t = new GbzTerminal(sockets);//burda web service çağırılacak
                t.start();
                Socket s = baglantiKur(socket);
                if (s != null) {    //eger hata olusursa yada kuyruk doluysa, socket null donecektir.
                    InputStream inStream = s.getInputStream();
                    OutputStream outStream = s.getOutputStream();
                    Thread session = new GbzScannerClientHandler(inStream, outStream);
                    sockets.put(s.getInetAddress().getHostName(), (GbzScannerClientHandler) session);
                    session.start();
                }
            }
            return true;
        } else {
            System.out.println("Serversocket bulunmadıgı için işlem yapılamadı.");
            return false;
        }
    }

    /**
     * Verilen serverSocketten bir soket acarak baglanti bekler. Gelen
     * baglantiyi Map'e ekler ve acilan soketi dondurur.
     *
     * @param serSocket
     * @return
     */
    private Socket baglantiKur(ServerSocket serSocket) {
        Socket s = null;
        if (serSocket != null) {
            if (sockets.size() < getMaxClientSize()) {
                try {
                    s = serSocket.accept();
                } catch (IOException ex) {
                    System.out.println("Baglanti kurulamadi");
                    s = null;
                }
            } else {
                System.out.println("Serverin tasiyabilecegi Client sayisi dolu!");
            }
        }
        return s;

    }

    /**
     * servera ait ayarlar yapılır.
     */
    private void serverAyarlariniYap() {
        Properties prop = new Properties();
        String fileName = Parametre.SERVER_CONFIG_FILE_NAME;
        try {
            InputStream is = new FileInputStream(fileName);
            prop.load(is);
        } catch (IOException e) {
            System.out.println("Dosya yuklerken hata olustu. Varsayılan ayarlarla devam ediliyor: " + e);

        }
        try {
            setPortNumber(Integer.parseInt(prop.getProperty("portNumber")));
            setMaxClientSize(Integer.parseInt(prop.getProperty("maxClientSize")));
        } catch (NumberFormatException e) {
            System.out.println("Veriler okunamadi. Varsaılan ayarlarla devam ediliyor: " + e.getMessage());

        }

    }
}